


from rest_framework import serializers

from drfstudy.models import Student, Classes


# 普通类  ===》 功能==》继承
# 学生序列化器

# class StudentSerializer(serializers.Serializer):
    # read_only=True 只允许前端查看id 不能修改学生id 只读
    # label 前端的备注信息
    # required=False 允许为空
    # id = serializers.IntegerField(read_only=True,label='ID')
    # name = serializers.CharField(max_length=20,label='姓名')
    # age = serializers.IntegerField(required=False,label="年龄")
    # sex = serializers.IntegerField(required=False,label="性别")
    # create_time = serializers.DateTimeField(required=False,label="创建时间")
    # update_time = serializers.DateTimeField(required=False,label="修改时间")
    # is_delete = serializers.BooleanField(required=False,label="逻辑删除",default=False)
    # 序列化  吧python数据转json数据 响应到前端
    # num = serializers.IntegerField(default=23)

    # 校验数据的时候 序列化器字段和模型字段一致
    # 响应数据的时候 序列化器的字段可以不和模型字段一致

    # 数据持久化操作
    # 重写 create方法
#     def create(self, validated_data):
#         # validated_data  前端传入的 json数据 经过  序列化器转python格式数据  {}
#         # print(validated_data)
#         # **validated_data
#         return  Student.objects.create(**validated_data)
#
#
#     def update(self, instance, validated_data):
#         # instance 原本模型数据
#         # validated_data  新数据
#         print(instance,validated_data)
#         # 没有修改的 就还是 instance的原数据
#         instance.name = validated_data.get('name',instance.name)
#         instance.sex = validated_data.get('sex',instance.sex)
#         instance.age = validated_data.get('age',instance.age)
#         # 模型里面的save方法
#         instance.save()
#         # 返回更新后的数据
#         return instance
# #

# StudentSerializer==>Serializer


# StudentSerializer=>ModelSerializer=>Serializer
# 更强大Serializer   ModelSerializer



# 序列化器
class StudentSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Student
        exclude = ["is_delete","create_time","update_time","classes"]

# 班级的序列化器
class ClassesSerializer(serializers.ModelSerializer):
    # 班级去查询学生的数据 反向查询 Classes.student_set
    # 是多个数据 一个班级有多个学生  对于多个学生的数据进行  序列化
    # 这个字段名不能随便改  必须用管理器名
    # 通过管理器去得到学生的数据 然后进行序列化返回
    # student_set = StudentSerializer(many=True, read_only=True)
    student_set = StudentSerializerSimple(many=True, read_only=True)
    class Meta:
        model = Classes
        fields = "__all__"

# StudentSerializerSimple 和StudentSerializer 是一样的都是对学生模型进行序列化和反序化
# 只是说StudentSerializerSimple 里面 序列化的字段少一些
# 而和StudentSerializer 里面自定义的校验规则多一些，展示的字段多一些

class ClassesSerializerSimple(serializers.ModelSerializer):
    class Meta:
        model = Classes
        fields = "__all__"

# 模型序列器
# 学生序列化器
class StudentSerializer(serializers.ModelSerializer):
    # ModelSerializer  字段的校验
    # create  update 写好了
    # 告诉ModelSerializer 要对哪一个模型进行 序列化和反序列化
    # 添加一个字段  序列化的时候响应到前端
    # Student.classes.name # 正向查询
    # read_only 设置只读  在进行序列化的时候 可以看到 但是反序列化时候 是无法操作
    classname = serializers.CharField(source="classes.name", read_only=True)
    # 一个学生 一个班级  正向查询
    classes = ClassesSerializerSimple(read_only=True)


    class Meta:
        model = Student # 学生这个模型
        # fields 字段 __all__ 所以
        # 序列化的时候 哪一些字段进行 响应到前端
        # fields = '__all__'
        # 限制不响应的字段 序列化  反序列化的时候 都无法操作
        exclude = ["is_delete"]
        extra_kwargs = {
            # 在反序列化的时候 可以写  ，但是在序列化的时候无法查询
            'classes':{"write_only":True},
            # 除了限制字段 还能设置规则 简单的校验规则
            # 'age':{'min_value':16,'max_value':100},
        }
    # 属性级别的校验方法 name
    # validate_字段名  改字段的校验规则
    # value 拿到的就是 前端传入的 value= name = 值
    def validate_name(self,value):
        if 'jt' not in value:
            raise serializers.ValidationError("名字必须又jt")
        else:
            return value

        # 对象级别的校验  多个字段的校验规则
    # def validate(self, attrs):
    #     # attrs 拿到的就是前端传入的数据 {}
    #
    #     if attrs.get("age") < 18:
    #         raise serializers.ValidationError("年龄不合法")
    #
    #     if 'jt' not in attrs.get("name"):
    #         raise serializers.ValidationError("名字必须又jt")
    #
    #     return attrs